#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Solution {
		int m, n;
		bool vis[1010][1010];
	public:
		int cutOffTree(vector<vector<int>> &f) {
			m = f.size();
			n = f[0].size();
			vector<pair<int, int>>sf;
			for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					if (f[i][j] != 0 && f[i][j] != 1)
						sf.push_back({i, j});
				}
			}
			sort(sf.begin(), sf.end(), [&](const pair<int, int> &p1, const pair<int, int> &p2) {
				return f[p1.first][p1.second] < f[p2.first][p2.second];
			});
			int bx = 0, by = 0;
			int ans = 0;
			for (auto&[a, b] : sf) {
				int step = bfs(f, bx, by, a, b);
				if (step == -1)
					return -1;
				ans += step;
				bx = a, by = b;
			}
			return ans;
		}
		int dx[4] = {0, 0, -1, 1};
		int dy[4] = {-1, 1, 0, 0};
		int bfs(vector<int>f, int bx, int by, int a, int b) {
			if (bx == a && by == b)
				return 0;
			queue<pair<int, int>>q;
			q.push({bx, by});
			memset(vis, 0, sizeof(vis));
			vis[bx][by] = false;
			int ans = 0;
			while (q.size()) {
				int sz = q.size();
				ans++;
				while (sz--) {
					auto[a, b] = q.front();
					q.pop();
					for (int i = 0; i < 4; i++) {
						int x = a + dx[i];
						int y = b + dy[i];
						if (x >= 0 && x < m && y >= 0 && y < n && f[x][y] != 0 && !vis[x][y]) {
							if (x == a && y == b)
								return ans;
							q.push({x, y});
						}
					}
				}
			}
			return -1;
		}
};

int main() {

}

//int main() {
//	string s;
//	cin >> s;
//	int ans = 1;
//	string ret;
//	for (int i = 1; i < s.size(); i++) {
//		if (s[i] != s[i - 1] || i == s.size() - 1) {
//			if (i == s.size() - 1) {
//				if (s[i] != s[i - 1]) {
//					ret += s[i - 1];
//					if (ans != 1) {
//						ret += to_string(ans);
//					}
//					ret += s[i];
//				} else {
//					ans++;
//					ret += s[i];
//					ret += to_string(ans);
//				}
//			} else {
//				if (s[i] != s[i - 1]) {
//					ret += s[i - 1];
//				}
//				if (ans != 1) {
//					ret += to_string(ans);
//				}
//			}
//			ans = 1;
//		} else {
//			ans++;
//		}
//	}
//	int num = 0;
//	for (int i = 1; i < ret.size(); i++) {
//		if (ret[i] != ret[i - 1]) {
//			num++;
//		}
//	}
//	if (num == s.size() - 1) {
//		cout << "NO";
//	} else {
//		for (auto ch : ret) {
//			cout << ch;
//		}
//	}
//	return 0;
//}